gusucode.com > VC++ QQ头像连连看游戏源码-源码程序 > VC++ QQ头像连连看游戏源码-源码程序\code\ClassMan.cpp
// CChessMan.cpp : implementation file // Download by http://www.NewXing.com #include "stdafx.h" #include "llk.h" #include "ChessMan.h" #include "LlkDlg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // CChessMan CChessMan::CChessMan() { } CChessMan::CChessMan(int id, POINT pos) { m_id = id; m_pos = pos; } CChessMan::~CChessMan() { } BEGIN_MESSAGE_MAP(CChessMan, CButton) //{{AFX_MSG_MAP(CChessMan) ON_WM_LBUTTONDOWN() //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CChessMan message handlers BOOL CChessMan::FindLine(int map[][MAXY], POINT p1, POINT p2) { int max, min; int i; if(p1.x == p2.x) { max = (p1.y>p2.y)?p1.y:p2.y; min = (p1.y<p2.y)?p1.y:p2.y; if(max == min+1) return TRUE;//相邻的两个格子 for(i=min+1; i<max; i++) { if((map[p1.x][i]!=0) && (map[p1.x][i]!=-1)) return FALSE; } return TRUE; } if(p1.y == p2.y) { max = (p1.x>p2.x)?p1.x:p2.x; min = (p1.x<p2.x)?p1.x:p2.x; if(max == min+1) return TRUE;//相邻的两个格子 for(i=min+1; i<max; i++) { if((map[i][p1.y]!=0) && (map[i][p1.y]!=-1)) return FALSE; } return TRUE; } return FALSE; } BOOL CChessMan::FindCorner(int map[][MAXY], POINT p1, POINT p2) { int maxx, maxy, minx, miny; POINT tempPoint = {0}; //测试矩形格子 maxx = (p1.x>p2.x)?p1.x:p2.x; maxy = (p1.y>p2.y)?p1.y:p2.y; minx = (p1.x<p2.x)?p1.x:p2.x; miny = (p1.y<p2.y)?p1.y:p2.y; if(map[minx][maxy] == 0) { tempPoint.x = minx; tempPoint.y = maxy; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) return TRUE; } if(map[maxx][miny] == 0) { tempPoint.x = maxx; tempPoint.y = miny; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) return TRUE; } if(map[minx][miny] == 0) { tempPoint.x = minx; tempPoint.y = miny; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) return TRUE; } if(map[maxx][maxy] == 0) { tempPoint.x = maxx; tempPoint.y = maxy; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) return TRUE; } return FALSE; } BOOL CChessMan::FindCorner(int map[][MAXY], POINT p1, POINT p2, POINT *cross1) { int maxx, maxy, minx, miny; POINT tempPoint = {0}; //测试矩形格子 maxx = (p1.x>p2.x)?p1.x:p2.x; maxy = (p1.y>p2.y)?p1.y:p2.y; minx = (p1.x<p2.x)?p1.x:p2.x; miny = (p1.y<p2.y)?p1.y:p2.y; if(map[minx][maxy] == 0) { tempPoint.x = minx; tempPoint.y = maxy; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) { cross1->x = tempPoint.x; cross1->y = tempPoint.y; return TRUE; } } if(map[maxx][miny] == 0) { tempPoint.x = maxx; tempPoint.y = miny; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) { cross1->x = tempPoint.x; cross1->y = tempPoint.y; return TRUE; } } if(map[minx][miny] == 0) { tempPoint.x = minx; tempPoint.y = miny; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) { cross1->x = tempPoint.x; cross1->y = tempPoint.y; return TRUE; } } if(map[maxx][maxy] == 0) { tempPoint.x = maxx; tempPoint.y = maxy; if((FindLine(map, p1, tempPoint)) && (FindLine(map, tempPoint, p2))) { cross1->x = tempPoint.x; cross1->y = tempPoint.y; return TRUE; } } return FALSE; } BOOL CChessMan::FindTwoCorner(int map[][MAXY], POINT p1, POINT p2) { int i; POINT tempPoint = {0}; //横向 for(i=0; i<MAXY; i++) { if(i == p1.y) continue; tempPoint.x = p1.x; tempPoint.y = i; if((map[tempPoint.x][tempPoint.y]==0) || (map[tempPoint.x][tempPoint.y]==-1)) { if(FindLine(map, tempPoint, p1)) { tempPoint.x = p2.x; if((map[tempPoint.x][tempPoint.y]==0) || (map[tempPoint.x][tempPoint.y]==-1)) { if(FindLine(map, tempPoint, p2)) return TRUE; } } } } //纵向 for(i=0; i<MAXX; i++) { if(i == p1.x) continue; tempPoint.x = i; tempPoint.y = p1.y; if((map[tempPoint.x][tempPoint.y]==0) || (map[tempPoint.x][tempPoint.y]==-1)) { if(FindLine(map, tempPoint, p1)) { tempPoint.y = p2.y; if((map[tempPoint.x][tempPoint.y]==0) || (map[tempPoint.x][tempPoint.y]==-1)) { if(FindLine(map, tempPoint, p2)) return TRUE; } } } } return FALSE; } BOOL CChessMan::FindTwoCorner(int map[][MAXY], POINT p1, POINT p2, POINT *cross1, POINT *cross2) { int i; POINT tempPoint1 = {0}; POINT tempPoint2 = {0}; //横向 for(i=0; i<MAXY; i++) { if(i == p1.y) continue; tempPoint1.x = p1.x; tempPoint1.y = i; if((map[tempPoint1.x][tempPoint1.y]==0) || (map[tempPoint1.x][tempPoint1.y]==-1)) { if(FindLine(map, tempPoint1, p1)) { tempPoint2.x = p2.x; tempPoint2.y = i; if((map[tempPoint2.x][tempPoint2.y]==0) || (map[tempPoint2.x][tempPoint2.y]==-1)) { if(FindLine(map, tempPoint2, p2)) { if(FindLine(map, tempPoint1, tempPoint2))//判断两个转折点是否连通!!! { cross1->x = p1.x; cross1->y = i; cross2->x = p2.x; cross2->y = i; return TRUE; } } } } } } //纵向 for(i=0; i<MAXX; i++) { if(i == p1.x) continue; tempPoint1.x = i; tempPoint1.y = p1.y; if((map[tempPoint1.x][tempPoint1.y]==0) || (map[tempPoint1.x][tempPoint1.y]==-1)) { if(FindLine(map, tempPoint1, p1)) { tempPoint2.x = i; tempPoint2.y = p2.y; if((map[tempPoint2.x][tempPoint2.y]==0) || (map[tempPoint2.x][tempPoint2.y]==-1)) { if(FindLine(map, tempPoint2, p2)) { if(FindLine(map, tempPoint1, tempPoint2))//判断两个转折点是否连通!!! { cross1->x = i; cross1->y = p1.y; cross2->x = i; cross2->y = p2.y; return TRUE; } } } } } } return FALSE; } BOOL CChessMan::Find(int map[MAXX][MAXY], POINT p1, POINT p2) { CLlkDlg *parent = (CLlkDlg *)GetParent(); CString str; if(FindLine(map, p1, p2)) { str.Format("直线:(%d,%d)->(%d,%d)\n", p1.x, p1.y, p2.x, p2.y); parent->m_method.SetWindowText(str); return TRUE; } if(FindCorner(map, p1, p2)) { str.Format("一拐角:(%d,%d)->(%d,%d)\n", p1.x, p1.y, p2.x, p2.y); parent->m_method.SetWindowText(str); return TRUE; } if(FindTwoCorner(map, p1, p2)) { str.Format("两拐角:(%d,%d)->(%d,%d)\n", p1.x, p1.y, p2.x, p2.y); parent->m_method.SetWindowText(str); return TRUE; } return FALSE; } BOOL CChessMan::Find(int map[][MAXY], POINT p1, POINT p2, POINT cross1, POINT cross2) { CLlkDlg *parent = (CLlkDlg *)GetParent(); parent->m_line.m_src1 = p1; parent->m_line.m_src2 = p2; CString str; if(FindLine(map, p1, p2)) { str.Format("直线:(%d,%d)->(%d,%d)\n", p1.x, p1.y, p2.x, p2.y); parent->m_method.SetWindowText(str); parent->m_line.m_lineNum = 1; return TRUE; } if(FindCorner(map, p1, p2, &(parent->m_line.m_crossP1))) { str.Format("一拐角:(%d,%d)->(%d,%d)\n", p1.x, p1.y, p2.x, p2.y); parent->m_method.SetWindowText(str); parent->m_line.m_lineNum = 2; return TRUE; } if(FindTwoCorner(map, p1, p2, &(parent->m_line.m_crossP1), &(parent->m_line.m_crossP2))) { str.Format("两拐角:(%d,%d)->(%d,%d)\n", p1.x, p1.y, p2.x, p2.y); parent->m_method.SetWindowText(str); parent->m_line.m_lineNum = 3; return TRUE; } return FALSE; } BOOL CChessMan::IsEmpty(int map[][MAXY]) { int i, j; int sum = 0; for(i=1; i<MAXX-1; i++) for(j=1; j<MAXY-1; j++) sum += map[i][j]; if(sum) return FALSE; else return TRUE; } BOOL CChessMan::Hint(int map[][MAXY]) { int x1, y1, x2, y2; POINT p1 = {0}; POINT p2 = {0}; for(x1=1; x1<MAXX-1; x1++) for(y1=1; y1<MAXY-1; y1++) for(x2=1; x2<MAXX-1; x2++) for(y2=1; y2<MAXY-1; y2++) { p1.x = x1; p1.y = y1; p2.x = x2; p2.y = y2; if((map[x1][y1]==0) || (map[x2][y2]==0))//空白格子 continue; if(map[x1][y1] != map[x2][y2])//不相等 continue; if((x1==x2) && (y1==y2))//同一个点 continue; if(FindLine(map, p1, p2)) return TRUE; if(FindCorner(map, p1, p2)) return TRUE; if(FindTwoCorner(map, p1, p2)) return TRUE; } return FALSE; } BOOL CChessMan::Hint(int map[][MAXY], int *a1, int *a2) { int x1, y1, x2, y2; POINT p1 = {0}; POINT p2 = {0}; for(x1=1; x1<MAXX-1; x1++) for(y1=1; y1<MAXY-1; y1++) for(x2=1; x2<MAXX-1; x2++) for(y2=1; y2<MAXY-1; y2++) { p1.x = x1; p1.y = y1; p2.x = x2; p2.y = y2; if((map[x1][y1]==0) || (map[x2][y2]==0))//空白格子 continue; if(map[x1][y1] != map[x2][y2])//不相等 continue; if((x1==x2) && (y1==y2))//同一个点 continue; if(FindLine(map, p1, p2)) { *a1 = (x1-1) * (MAXY-2) + y1 - 1; *a2 = (x2-1) * (MAXY-2) + y2 - 1; return TRUE; } if(FindCorner(map, p1, p2)) { *a1 = (x1-1) * (MAXY-2) + y1 - 1; *a2 = (x2-1) * (MAXY-2) + y2 - 1; return TRUE; } if(FindTwoCorner(map, p1, p2)) { *a1 = (x1-1) * (MAXY-2) + y1 - 1; *a2 = (x2-1) * (MAXY-2) + y2 - 1; return TRUE; } } return FALSE; } void CChessMan::OnLButtonDown(UINT nFlags, CPoint point) //用此事件可以加快响应速度(不用Clicked事件) { // TODO: Add your message handler code here and/or call default SetButtonStyle(BS_DEFPUSHBUTTON);//显示黑边框 CLlkDlg *parent = (CLlkDlg *)GetParent(); if((parent->m_p==NULL) || (parent->m_p->m_id!=m_id) || ((parent->m_p->m_pos.x==m_pos.x)&&(parent->m_p->m_pos.y==m_pos.y))){ parent->m_p = this; if(parent->m_line.m_lineNum != 0){ parent->m_line.m_lineNum = 0; parent->RefreshMap(); parent->m_line.Invalidate(); } } else { if(Find(parent->map, parent->m_p->m_pos, m_pos, parent->m_line.m_crossP1, parent->m_line.m_crossP2)) { //消去 parent->map[parent->m_p->m_pos.x][parent->m_p->m_pos.y] = 0; parent->map[m_pos.x][m_pos.y] = 0; //delete parent->m_p; //delete this; parent->m_p->ShowWindow(SW_HIDE);//不能用delete!!!否则重新开始时无法清除原有按钮 this->ShowWindow(SW_HIDE); parent->RefreshMap(); parent->m_line.Invalidate(); parent->m_p = NULL; parent->m_timePoint += 10;//增加时间点 //画时间条 CRgn rgn; rgn.CreateRectRgn(150, 20, parent->m_timePoint, 40); parent->m_timeRgn.CopyRgn(&rgn); parent->InvalidateRgn(&(parent->m_timeRgn)); if(IsEmpty(parent->map))//是否消完 { int ret = MessageBox("过关拉!要挑战下一关吗?", "恭喜你!", MB_ICONINFORMATION|MB_OKCANCEL); if(ret == IDOK) parent->Reset(); else { for(int i=0; i<(MAXX-2)*(MAXY-2); i++) delete (CChessMan *)parent->m_btnGroup.GetAt(i); parent->DestroyWindow(); } } if(!Hint(parent->map))//是否无处可消 { parent->m_exchangeNum++; parent->CallExchange(); parent->m_method.SetWindowText("无可用消除!自动切换!"); } } else parent->m_p = this; } }